qt录音器的实例,很简单的例子

您所在的位置:网站首页 qt 声音 qt录音器的实例,很简单的例子

qt录音器的实例,很简单的例子

2024-07-11 04:02| 来源: 网络整理| 查看: 265

话不多说上例子:

通过录入后,可以获取我们的声音了,还是非常简单的:

先看布局吧:

 

就是这莫简单的:

在写多媒体的时候,工程要添加:

QT += multimedia

添加后,我们在对应头文件中添加:

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT private: QAudioRecorder *recorder; //音频录音 QAudioProbe *probe; //探测器 public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: //自定义槽函数 void onStateChanged(QMediaRecorder::State state);//recorder void onDurationChanged(qint64 duration);//recorder void processBuffer(const QAudioBuffer& buffer);//probe void on_actRecord_triggered(); void on_actPause_triggered(); void on_actStop_triggered(); void on_btnGetFile_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H

函数初始化:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); recorder = new QAudioRecorder(this); probe = new QAudioProbe; //探测器 connect(probe,&QAudioProbe::audioBufferProbed, this,&MainWindow::processBuffer); //关联函数 probe->setSource(recorder); connect(recorder,&QAudioRecorder::stateChanged, this,&MainWindow::onStateChanged); connect(recorder,&QAudioRecorder::durationChanged, this,&MainWindow::onDurationChanged); if(recorder->defaultAudioInput().isEmpty()) { return; //无音频录入设备 } foreach(const QString &device,recorder->audioInputs()) { ui->comboDevices->addItem(device); //音频录音设备 } foreach(const QString &codeName, recorder->supportedAudioCodecs()) { ui->comboCodec->addItem(codeName); //支持的音频编码 } foreach(int sampleRate,recorder->supportedAudioSampleRates()) { ui->comboSampleRate->addItem(QString::number(sampleRate)); //支持的采样率 } //channels ui->comboChannels->addItem("1"); ui->comboChannels->addItem("2"); ui->comboChannels->addItem("4"); //quality ui->sliderQuality->setRange(0,int(QMultimedia::VeryHighQuality)); //范围是0 到最好 ui->sliderQuality->setValue(int(QMultimedia::NormalQuality)); //选择正常的录音 //bitrates: ui->comboBitrate->addItem("32000"); ui->comboBitrate->addItem("64000"); ui->comboBitrate->addItem("96000"); ui->comboBitrate->addItem("128000"); }

QAudioRecorder 类型变量 recorder 用 于录音, QAudioProb巳 类型变量 probe 用于探测缓冲区数据。

        槽函数 onStateChanged()与 recorder 的 stateChanged()信号关联 , 在 recorder 的状态变化时控制界面上“录音”“暂停”“停止” 等按钮的使能状态 。

void MainWindow::onStateChanged(QMediaRecorder::State state) { //录音状态变化 ui->actRecord->setEnabled(state!=QMediaRecorder::RecordingState); ui->actPause->setEnabled(state == QMediaRecorder::RecordingState); ui->actStop->setEnabled(state==QMediaRecorder::RecordingState); ui->btnGetFile->setEnabled(state==QMediaRecorder::StoppedState); ui->editOutputFile->setEnabled(state==QMediaRecorder::StoppedState); } void MainWindow::onDurationChanged(qint64 duration) { //录音持续时间变化 ui->LabPassTime->setText(QString("已录制 %1 秒").arg(duration / 1000)); }

      槽函数 processBuffer() 与 probe 的 信号 audioBufferProbed() 关联 ,这个信号会传递 一 个QAudioBuffer 类型的变量 ,这个变量里存储了缓冲区的信息和音频原始数据 。  

void MainWindow::processBuffer(const QAudioBuffer &buffer) { //处理探测到的缓冲区 ui->spin_byteCount->setValue(buffer.byteCount());//缓冲区字节数 ui->spin_duration->setValue(buffer.duration()/1000);//缓冲区时长 ui->spin_frameCount->setValue(buffer.frameCount());//缓冲区帧数 ui->spin_sampleCount->setValue(buffer.sampleCount());//缓冲区采样数 QAudioFormat audioFormat=buffer.format();//缓冲区格式 ui->spin_channelCount->setValue(audioFormat.channelCount()); //通道数 ui->spin_sampleSize->setValue(audioFormat.sampleSize());//采样大小 ui->spin_sampleRate->setValue(audioFormat.sampleRate());//采样率 ui->spin_bytesPerFrame->setValue(audioFormat.bytesPerFrame());//每帧字节数 if (audioFormat.byteOrder()==QAudioFormat::LittleEndian) ui->edit_byteOrder->setText("LittleEndian");//字节序 else ui->edit_byteOrder->setText("BigEndian"); ui->edit_codec->setText(audioFormat.codec());//编码格式 if (audioFormat.sampleType()==QAudioFormat::SignedInt)//采样点类型 ui->edit_sampleType->setText("SignedInt"); else if(audioFormat.sampleType()==QAudioFormat::UnSignedInt) ui->edit_sampleType->setText("UnSignedInt"); else if(audioFormat.sampleType()==QAudioFormat::Float) ui->edit_sampleType->setText("Float"); else ui->edit_sampleType->setText("Unknown"); }

选择一个录音输出文件后,就可以通过界面上“录音” “暂停”“停止” 三个按钮进行录音控制, 三个按钮代码如下:

void MainWindow::on_actRecord_triggered() { //开始录音 if(recorder->state() == QMediaRecorder::StoppedState) //已停止,从新设置 { QString selectedFile = ui->editOutputFile->text().trimmed(); if(selectedFile.isEmpty()) { QMessageBox::critical(this,"错误","所设置录音输出文件被占用,无法删除"); return; } if(QFile::exists(selectedFile)) { if(!QFile::remove(selectedFile)) { QMessageBox::critical(this,"错误","所设置录音输出文件被占用,无法删除"); return; } } recorder->setOutputLocation(QUrl::fromLocalFile(selectedFile));//设置输出文件 recorder->setAudioInput(ui->comboDevices->currentText()); //设置录入设备 QAudioEncoderSettings settings; //音频编码设置 settings.setCodec(ui->comboCodec->currentText()); //编码 settings.setSampleRate(ui->comboSampleRate->currentText().toInt());//采样率 settings.setBitRate(ui->comboBitrate->currentText().toInt());//比特率 settings.setChannelCount(ui->comboChannels->currentText().toInt()); //通道数 settings.setQuality(QMultimedia::EncodingQuality(ui->sliderQuality->value())); //品质 if (ui->radioQuality->isChecked())//编码模式为固定品质,自动决定采样率,采样点大小 settings.setEncodingMode(QMultimedia::ConstantQualityEncoding); else settings.setEncodingMode(QMultimedia::ConstantBitRateEncoding);//固定比特率 recorder->setAudioSettings(settings); } recorder->record(); //开始记录啦 } void MainWindow::on_actPause_triggered() { //暂停 recorder->pause(); } void MainWindow::on_actStop_triggered() { //停止 recorder->stop(); }

保存文件:

void MainWindow::on_btnGetFile_clicked() { //设置保存文件 QString curPath=QDir::homePath();//获取系统当前目录 QString dlgTitle="选择输出文件"; //对话框标题 QString filter="wav文件(*.wav)"; //文件过滤器 QString selectedFile=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter); if (!selectedFile.isEmpty()) ui->editOutputFile->setText(selectedFile); }

连接:

链接:https://pan.baidu.com/s/1CrP481SP74iXWPO0kzSPew  提取码:yosk



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3